#include "cola_posix.h"

Cola::Cola(){
    descriptor=-1;
};

void Cola::conectar(std::string nombre) throw(){
    this->nombre=nombre;
    mq_attr attr;
    attr.mq_flags = 0;
    attr.mq_curmsgs = 0;
    attr.mq_msgsize= COLA_MSG_MAX_SIZE;
    attr.mq_maxmsg = 10;
    descriptor = mq_open(nombre.c_str(), O_CREAT|O_RDWR, 0666, &attr);
    if(descriptor == -1){
	perror("Abriendo cola");
	throw ExcepcionCola();
    }
}

void Cola::enviar(Mensaje &m) throw(){
    int resultado = mq_send(descriptor, m.getBuffer(), m.getLongitud(), 0);
    if(resultado == -1){
	perror("Enviando mensaje");
	throw ExcepcionCola();
    }
}
    
Mensaje Cola::recibir() throw(){
    size_t recibido=0;
    std::vector<char> buffer;
    buffer.resize(COLA_MSG_MAX_SIZE);
    recibido = mq_receive(descriptor, &buffer[0], COLA_MSG_MAX_SIZE, 0);
	
    if(recibido == (size_t) -1){
	perror("Recibiendo mensaje");
	throw ExcepcionCola();
    }
    Mensaje m(&buffer[0], recibido);
    return m;
}

void Cola::cerrar(){
    if(descriptor != -1)
	mq_close(descriptor);
    descriptor=-1;
}

void Cola::destruir(){
    mq_unlink(nombre.c_str());
}

void Cola::setNoBloqueante(bool estado){
    if(descriptor != -1){
	mq_attr attr;
	attr.mq_flags = estado?O_NONBLOCK:0;
	attr.mq_curmsgs = 0;
	attr.mq_msgsize= COLA_MSG_MAX_SIZE;
	attr.mq_maxmsg = 10;
	mq_setattr(descriptor, &attr, NULL);
    }
}

Cola::~Cola(){
    cerrar();
}
